//
// Created by Administrator on 2021/11/22.
//
#include "ConfigUtil.h"

std::map<std::string, String> configMap;

/**
 * 初始化
 */
void ConfigUtil::init() {
    std::vector<String> configList = FileUtil::readLineStrFromFile("resource/config.ini");
    for (String config : configList) {
        config = config.trim();
        if(config.empty() || config.startWith("#")){
            continue;
        }
        std::vector<String> outArray;
        config.split("=", outArray);

        if(outArray.size() >= 2){
            configMap.insert(std::make_pair(outArray[0].c_str(), outArray[1]));
        }
    }
}

/**
 * 加载配置
 * @param key 配置key
 * @return 配置值
 */
template<> String ConfigUtil::loadConfig<String>(String key) {
    if(configMap.empty()){
        init();
    }
    if(configMap.count(key.c_str()) > 0){
        return configMap[key.c_str()];
    }
    MAssert::check(false, String::toString("The config param not found: [%s]", key.c_str()).c_str());
    return NULL;
}

/**
 * 加载配置
 * @param key 配置key
 * @return 配置值
 */
template<> std::vector<String> ConfigUtil::loadConfig<std::vector<String>>(String key) {
    if(configMap.empty()){
        init();
    }
    if(configMap.count(key.c_str()) > 0){
        String v =  configMap[key.c_str()];
        std::vector<String> array;
        v.split(",", array);
        return array;
    }
    MAssert::check(false, String::toString("The config param not found: [%s]", key.c_str()).c_str());
    return {};
}

/**
 * 加载配置
 * @param key 配置key
 * @return 配置值
 */
template<> int ConfigUtil::loadConfig<int>(String key) {
    if(configMap.empty()){
        init();
    }
    if(configMap.count(key.c_str()) > 0){
        String v = configMap[key.c_str()];
        return v.toInt();
    }
    MAssert::check(false, String::toString("The config param not found: [%s]", key.c_str()).c_str());
    return -1;
}


/**
 * 加载配置
 * @param key 配置key
 * @return 配置值
 */
template<> double ConfigUtil::loadConfig<double>(String key) {
    if(configMap.empty()){
        init();
    }
    if(configMap.count(key.c_str()) > 0){
        String v = configMap[key.c_str()];
        return v.toDouble();
    }
    MAssert::check(false, String::toString("The config param not found: [%s]", key.c_str()).c_str());
    return -1;
}